import os
import pandas as pd
import json
import logging
from openai import OpenAI
import shutil

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 初始化 DeepSeek 客户端
client = OpenAI(api_key="sk-5uqqDiWSWxEXjjQkN28yazPbb7pWjH7ZosrJbCZpSj5ryaYK", base_url="https://tbnx.plus7.plus/v1")

def get_relevant_knowledge_points(row):
    """
    从 'point' 列中提取相关知识点，基于 'relevant_points' 列中的编号。
    :param row: DataFrame 中的一行
    :return: 相关知识点列表
    """
    # 提取 'point' 列中的所有知识点
    all_points = row['point'].split('\n')  # 按换行符拆分知识点

    # 提取 'relevant_points' 列中的相关知识点编号
    relevant_points_str = row['relevant_points']

    # 检查 relevant_points 是否为空
    if pd.isna(relevant_points_str) or not relevant_points_str.strip():
        return []  # 如果为空，返回空列表

    # 提取 'relevant_points' 列中的相关知识点编号
    relevant_indices = [int(idx) for idx in relevant_points_str.split(', ')]  # 按逗号加空格分隔，并转换为整数

    # 获取相关知识点（编号从1开始）
    relevant_points = [all_points[idx - 1].strip() for idx in relevant_indices]
    return relevant_points

def extend_knowledge_points(comment, relevant_points):
    """
    通过将评论与知识点结合，扩展知识点。
    :param comment: 原始评论
    :param relevant_points: 相关知识点列表
    :return: 扩展后的知识点列表
    """
    if(relevant_points ==[]) : return []
    # 构建提示词
    prompt = f"""
以下是背景对应的知识点：
{chr(10).join([f"{i+1}. {point}" for i, point in enumerate(relevant_points)])}

评论：{comment}

请将评论与知识点结合起来，生成扩展后的知识点，明确表达评论与知识点之间的关系，不要输出其他内容，输出扩展后的知识点就行。
"""
    try:
        logging.info(f"{prompt}")

        # 调用 DeepSeek API
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": "你是一个协助进行知识点扩展的助手。"},
                {"role": "user", "content": prompt},
            ],
            stream=False
        )

        # 提取返回结果
        result = response.choices[0].message.content.strip()
        logging.info(f"DeepSeek API 返回结果：{result}")

        # 从结果中提取扩展后的知识点
        extended_points = []
        for line in result.split('\n'):
            if line.strip() and not line.strip().isdigit():  # 跳过行号
                extended_points.append(line.strip())

        return extended_points

    except Exception as e:
        logging.error(f"调用 DeepSeek API 时出错：{e}")
        return relevant_points  # 如果扩展失败，返回原始知识点

def generate_knowledge_augmented_comment(comment, relevant_points):
    """
    通过将评论与扩展后的知识点结合，生成知识增强的评论。
    :param comment: 原始评论
    :param relevant_points: 相关知识点列表
    :return: 知识增强的评论
    """
    # 扩展知识点
    extended_points = extend_knowledge_points(comment, relevant_points)

    # 生成知识增强的评论
    if not extended_points:
        augmented_comment = f"评论：{comment}\n\n知识增强的评论：无可用的相关知识点来增强此评论。"
    else:
        augmented_comment = f"评论：{comment}\n\n知识增强的评论：\n"
        for i, point in enumerate(extended_points):
            augmented_comment += f"- {point}\n"
    return augmented_comment


def process_excel(input_file, output_file):
    """
    处理 Excel 文件，生成知识增强的评论并保存结果。
    :param input_file: 输入 Excel 文件路径
    :param output_file: 输出 Excel 文件路径
    """
    # 读取 Excel 文件
    df = pd.read_excel(input_file)

    # 初始化新列（如果不存在）
    if 'knowledge_augmented_comment' not in df.columns:
        df['knowledge_augmented_comment'] = None

    # 初始化计数器
    count = 0

    # 每隔多少条数据备份一次
    backup_interval = 50

    # 每处理完多少条数据保存一次
    save_interval = 10

    # 处理每一行
    for index, row in df.iterrows():
        # 检查 knowledge_augmented_comment 列是否为空
        if pd.isna(row['knowledge_augmented_comment']) or not row['knowledge_augmented_comment'].strip():
            comment = row['content']
            relevant_points = get_relevant_knowledge_points(row)

            # 生成知识增强的评论
            augmented_comment = generate_knowledge_augmented_comment(comment, relevant_points)

            # 更新 DataFrame
            df.at[index, 'knowledge_augmented_comment'] = augmented_comment

            # 每处理完一条数据，计数器加1
            count += 1

            # 每处理完 save_interval 条数据保存一次
            if count % save_interval == 0:
                df.to_excel(output_file, index=False)
                logging.info(f"数据已保存，当前处理到索引: {index}")

            # 每隔 backup_interval 条数据备份一次
            if count % backup_interval == 0:
                backup_file = os.path.splitext(output_file)[0] + f"_backup_{index}.xlsx"
                shutil.copy(output_file, backup_file)
                logging.info(f"备份已保存，当前处理到索引: {index}，备份文件: {backup_file}")
        else:
            logging.info(f"跳过索引 {index}，knowledge_augmented_comment 列已有数据")

        # 最后保存一次，确保所有数据都被保存到文件中
    df.to_excel(output_file, index=False)
    logging.info(f"处理后的数据已保存到 {output_file}")

# 主执行部分
if __name__ == "__main__":
    input_file = r"C:\Users\23248\PycharmProjects\stance\DataCrawler\data\aaa.xlsx"  # 替换为你的输入文件路径
    output_file = r"C:\Users\23248\PycharmProjects\stance\DataCrawler\data\tot_data_r_point_output_data4.xlsx"  # 替换为你想要的输出文件路径
    process_excel(input_file, output_file)